home *** CD-ROM | disk | FTP | other *** search
/ Aminet 21 / Aminet 21 (1997)(GTI - Schatztruhe)[!][Oct 1997].iso / Aminet / comm / bbs / cit_src_7H21.lha / file_comments.c < prev    next >
C/C++ Source or Header  |  1997-07-27  |  9KB  |  306 lines

  1. /************************************************************************/
  2. /*   File Comments Processing                                           */
  3. /************************************************************************/
  4. #define SYSTEM_DEPENDENT
  5. #define TIMER_FUNCTIONS_NEEDED
  6. #include "ctdl.h"
  7. #include "dos.h"
  8. #include "time.h"
  9. #include "string.h"
  10. #include "stdarg.h"
  11.  
  12. /************************************************************************/
  13. /*      Globals -- there shouldn't be anything here but statics and     */
  14. /*      externs.                                                        */
  15. /************************************************************************/
  16. static char *Phrase;
  17. extern char *READ_TEXT;
  18. extern char *WRITE_TEXT;
  19. static FILE *FileTag;                  /* For the file tags            */
  20. #define ONE_DAY         86400L
  21. #define D_OFFSET        252460800L
  22.  
  23. int Jsystem(char *);
  24. void Do_Stack_Check(void);
  25.  
  26.  
  27. extern MessageBuffer   msgBuf;
  28. extern CONFIG    cfg;            /* Lots an lots of variables    */
  29. void *ChPhrase(DirEntry *e, DirEntry *d);
  30. static char  File_Extension(char *name, char *extension);
  31. static void Change_Extension(char *name, char *extension);
  32. static char *Find_Extension(char *name);
  33.  
  34. static char filenamebuffer[100];
  35.  
  36.  
  37. #define ONE_DAY         86400L
  38. #define D_OFFSET        252460800L
  39.  
  40. static char *Find_Extension(char *name)
  41.   {
  42.   char *ptr, *lptr;
  43.   ptr = name;  /* point to last character */
  44.   while( ( lptr = strchr(ptr,'.') ) != NULL )
  45.     {
  46.     ptr = lptr;
  47.     if( *ptr == '.' ) ptr++;
  48.     };
  49.   return ptr;
  50.   }
  51.  
  52. static void Change_Extension(char *name, char *extension)
  53.   {
  54.   char *ptr;
  55.   int lfn, lex;
  56.   /**
  57.     Find the Extension of the name
  58.   **/
  59.   lfn  = strlen(name);
  60.   ptr  = Find_Extension(name);
  61.   lex  = strlen(ptr);
  62.   if( lfn > lex )lfn -= lex;  /* length of filename without extention */
  63.   memset(filenamebuffer,'\0',100);
  64.   strncpy(filenamebuffer,name,lfn);
  65.   strcat(filenamebuffer,extension);
  66.   return;
  67.   }
  68.  
  69. static char  File_Extension(char *name, char *extension)
  70.   {
  71.   char *ptr;
  72.   int lnm, lext;
  73.   /**
  74.     1) check to see that we have a valid pointer and that
  75.        the string is long enough to match
  76.   **/
  77.   if( name == NULL ) return (char)TRUE;
  78.   lnm =  strlen(name);
  79.   lext=  strlen(extension);
  80.   if( lnm < lext ) return (char)TRUE;
  81.   /**
  82.     Find the Extension of the name
  83.   **/
  84.   ptr = Find_Extension(name);
  85.   lnm = strlen(ptr);
  86.   if( lnm != lext ) return (char)FALSE;
  87.   if( stricmp(ptr, extension) == 0 ) return (char)TRUE;
  88.   return (char)FALSE;
  89.   }
  90.  
  91. /************************************************************************/
  92. /*      CitGetFileList() Get a list of files from the current "area"    */
  93. /************************************************************************/
  94. void CitGetFileList(char *mask, SListBase *list, long before, long after,
  95. char *phrase)
  96.   {
  97.   struct FileInfoBlock *FlBlock;
  98.   extern char     *monthTab[13];
  99.   char            *w, *work, *sp, again, buf[10];
  100.   DirEntry        *fp;
  101.   int             done;
  102.   long            time;
  103.   struct tm         *v;
  104.   Do_Stack_Check();
  105.   w = work = strdup(mask);
  106.   FlBlock = malloc(sizeof *FlBlock);
  107.   do
  108.     {
  109.     again = (sp = strchr(work, ' ')) != NULL;      /* space is separator */
  110.     if (again)
  111.       {
  112.       *sp = 0;
  113.  
  114.       }
  115.     /* Do all scanning for illegal requests here */
  116.     if (!ValidDirFileName(work))    continue;
  117.     for (done = dfind(FlBlock, work, 0);  !done;    done = dnext(FlBlock))
  118.       {
  119.       if( File_Extension(FlBlock->fib_FileName, "readme") )
  120.         continue; /* skip all readme files */
  121.       /* format date to our standards */
  122.       /* DosToNormal(buf, FlBlock->ff_fdate);  */
  123.       time = D_OFFSET + (long)(ONE_DAY * FlBlock->fib_Date.ds_Days) +
  124.       (long)(FlBlock->fib_Date.ds_Minute * 60) +
  125.       (long)(FlBlock->fib_Date.ds_Tick / 50);
  126.       v = localtime(&time);
  127.       sPrintf(buf, "%d%s%02d", v->tm_year, monthTab[v->tm_mon+1],
  128.       v->tm_mday);
  129.       /* now read it so we can handle date specs */
  130.       ReadDate(buf, &time);
  131.       /* add to list iff dates inactive or we meet the specs */
  132.       if ((before != -1l && time > before) || (after  != -1l && time < after))
  133.         continue;
  134.       fp = (DirEntry *) GetDynamic(sizeof *fp);
  135.       fp->unambig = strdup(FlBlock->fib_FileName);
  136.       strCpy(fp->FileDate, buf);
  137.       fp->FileSize = FlBlock->fib_Size;
  138.       AddData(list, fp, NULL, TRUE);
  139.  
  140.       }
  141.     if (again) work = sp+1;
  142.  
  143.     }
  144.   while (again);
  145.   free(w);
  146.   free(FlBlock);
  147.   if (strLen(phrase) != 0)
  148.     {
  149.     Phrase = phrase;
  150.     StFileComSearch();      /* so's we can do phrase searches */
  151.     list->CheckIt = ChPhrase;   /* COVER YOUR EYES I'M CHEATING! */
  152.     KillData(list, list);
  153.     list->CheckIt = DirCheck;   /* COVER YOUR EYES I'M CHEATING! */
  154.     EndFileComment();
  155.  
  156.     }
  157.  
  158.   }
  159.  
  160. /************************************************************************/
  161. /*      ChPhrase() does something to do with finding phrases in comments*/
  162. /************************************************************************/
  163. void *ChPhrase(DirEntry *e, DirEntry *d)
  164.   {
  165.   Do_Stack_Check();
  166.   if (FindFileComment(e->unambig))
  167.     {
  168.     if (matchString(msgBuf.mbtext, Phrase, lbyte(msgBuf.mbtext)) == NULL) return d;
  169.  
  170.     }
  171.   else return d;
  172.   return NULL;
  173.  
  174.   }
  175.  
  176. /************************************************************************/
  177. /*      CopyFile() copies a file                                        */
  178. /************************************************************************/
  179. char CopyFile(char *oldname, aRoom *roomData)
  180.   {
  181.   int len;
  182.   #ifdef NO_STAT
  183.   BPTR F_Lock;
  184.   struct FileInfoBlock *FIBlk;
  185.   char F_Ok;
  186.   LONG F_Status;
  187.   #else
  188.   struct stat buf;
  189.   #endif
  190.   char *temp;
  191.   char buffer[256];
  192.   char F_Node[32],F_Ext[32];
  193.   Do_Stack_Check();
  194.   if ((temp = FindDirName(roomData->rbArea)) == NULL)
  195.     {
  196.     Output_Citadel_Message("ERRDRM",NULL,NULL,NULL);
  197.     return FALSE;
  198.  
  199.     }
  200.   #ifdef NO_STAT
  201.   F_Ok = FALSE;
  202.   F_Lock = Lock(oldname,-2);
  203.   if (F_Lock != NULL)
  204.     {
  205.     FIBlk=(struct FileInfoBlock *)malloc(sizeof(struct FileInfoBlock));
  206.     if (FIBlk != NULL)
  207.       {
  208.       F_Status = Examine(F_Lock, FIBlk);
  209.       if (F_Status != 0)
  210.         {
  211.         if (FIBlk->fib_DirEntryType < 0)
  212.         F_Ok = TRUE;
  213.  
  214.         }
  215.       free(FIBlk);
  216.  
  217.       }
  218.     UnLock(F_Lock);
  219.  
  220.     }
  221.   if (!F_Ok)
  222.     {
  223.     Output_Citadel_Message("ISNCPY",(long)oldname,NULL,NULL);
  224.     return FALSE;
  225.  
  226.     }
  227.   #else
  228.   if (stat(oldname, &buf) != 0 || !(buf.st_mode & S_IFREG))
  229.     {
  230.     Output_Citadel_Message("ISNCPY",(long) oldname,NULL,NULL);
  231.     return FALSE;
  232.  
  233.     }
  234.   #endif
  235.   sPrintf(buffer, "copy >NIL: %s %s", oldname, temp);
  236.   Jsystem(buffer);  /* move file */
  237.   Change_Extension(oldname,"readme");
  238.   if( access(filenamebuffer,R_OK) == 0 )
  239.     {
  240.     sPrintf(buffer, "copy >NIL: %s %s", filenamebuffer, temp);
  241.     Jsystem(buffer);  /* move readme */
  242.     ZeroMsgBuffer(&msgBuf);
  243.     ingestFile(filenamebuffer,&msgBuf);
  244.     };
  245.   strsfn(oldname,NULL,NULL,F_Node,F_Ext);
  246.   temp = FindDirName(roomData->rbArea);
  247.   sPrintf(oldname, "%s%c%s", F_Node,(F_Ext[0] != 0) ? '.' : '\0', F_Ext);
  248.   len = strlen(temp);
  249.   if ( temp[len-1] == ':' || temp[len-1] == '/' )
  250.     {
  251.     sPrintf(buffer, "%s%s",temp,oldname);
  252.     }
  253.   else    sPrintf(buffer, "%s/%s",temp,oldname);
  254.   return ((char)(access(buffer, 0) == 0));
  255.  
  256.   }
  257.  
  258. /************************************************************************/
  259. /*      StFileComSearch() Start File Comment search: see SYSDEP.DOC.    */
  260. /************************************************************************/
  261. int StFileComSearch()
  262.   {
  263.   return TRUE;  /* a stub, nothing to do  */
  264.   }
  265.  
  266. /************************************************************************/
  267. /*      FindFileComment() find file comment for file: see SYSDEP.DOC.   */
  268. /************************************************************************/
  269. int FindFileComment(char *fileName)
  270.   {
  271.   char Found_Comment;
  272.   Do_Stack_Check();
  273.   ZeroMsgBuffer(&msgBuf);
  274.   Change_Extension(fileName,"readme");
  275.   Found_Comment = ingestFile(filenamebuffer,&msgBuf);
  276.   doCR();               /* formatting without blank lines.              */
  277.   return ( Found_Comment );
  278.   }
  279.  
  280. /************************************************************************/
  281. /*      EndFileComment() end session of reading file comments.          */
  282. /************************************************************************/
  283. void EndFileComment()
  284.   {
  285.   return;   /* just a stub */
  286.   }
  287.  
  288. /************************************************************************/
  289. /*      updFiletag()  updates a file tag                                */
  290. /************************************************************************/
  291. void updFiletag(char *fileName, char *desc)
  292.   {
  293.   Do_Stack_Check();
  294.   Change_Extension(fileName, "readme");
  295.   if ((FileTag = safeopen(filenamebuffer, WRITE_TEXT)) == NULL)
  296.     {
  297.     Output_Citadel_Message("UNKWNP",(long)filenamebuffer,NULL,NULL);
  298.     }
  299.   else
  300.     {
  301.     fprintf(FileTag, "%s\n",  desc);
  302.     fclose( FileTag);
  303.     }
  304.   return;
  305.   }
  306.